package com.dfbz.service;

import com.dfbz.model.*;

import java.util.List;
import java.util.Map;

public interface UserService {
    /**
     * 用户登录功能,通过用户名查找对应用户
     * @return User 返回一个用户对象
     * */
    User findByName(String username);

    /**
     * 用户注册功能,通过邮箱查找对应用户
     * @return User 返回一个用户对象
     * */
    User findByEmail(String value);

    /**
     *通过邮箱或用户名找到用户对象检查是否能注册
     * @param email 邮箱
     * @param username 用户名
     * @return boolean true为能注册，false则不可以注册
     */
    boolean checkByEmailOrName(String email, String username);


    /**
     * 添加新用户
     * @param user 用户对象
     * @return true为添加成功，false为添加失败
     */
    boolean addUser(User user);

    /**
     * 发送邮件获得验证码
     * @param email
     * @return 验证码
     */
    String sendEmailCode(String email);


    /**
     * 重置用户账号密码
     * @param email 用户邮箱
     * @param password 新密码
     * @return true重置成功，false重置失败
     */
    boolean resetPassword(String email, String password);

    /**
     * 查找用户基本信息
     * @param username 用户名
     * @return Map对象 里面有 realName 和 deptName
     */
    Map<String, Object> findUserBaseInfo(String username);

    /**
     * 更新用户登录时间
     * @param  userId 用户id
     */
    void updateLoginTime(Integer userId);


    /**
     * 根据用户ID查找个人中心信息
     * @param userId 用户ID
     * @return Map对象 包含了所有个人相关信息
     */
    Map<String, Object> getUserInfo(String userId);

    /**
     * 存储用户是否私密资料和部门ID信息
     * @param isSecret  是否私密
     * @param selectDept    部门id
     * @return true为存储成功，false为存储失败
     */
    boolean saveUserBaseInfo(String id,String isSecret, Integer selectDept);

    boolean saveUserBaseInfo(String id, String isSecret);

    /**
     * 存储用户详细信息
     * @param userInfo 用户信息对象
     * @return true为存储成功，false为存储失败
     */
    boolean saveUserDetailInfo(UserInfo userInfo);

    /**
     * 分页查询用户列表信息
     * @param userId 用户ID
     * @param currentPage 当前页码
     * @param name 模糊查询用户名
     * @return 列表对象
     */
    List<Map<String,Object>> findUserList(String userId,int currentPage, String name);

    /**
     * 分页查询用户总数信息
     * @param name 用户名
     * @return 用户总数
     */
    long getUserTotal(String name);


    /**
     * 关注用户
     * @param userId 登录用户ID
     * @param ufId 关注对象ID
     * @return true关注成功，false关注失败
     */
    boolean attentionUser(String userId, String ufId);

    /**
     * 根据用户id和对方id查询是否已经关注
     * @param userId 登录用户ID
     * @param ufId 被关注用户ID
     * @return 关注对象信息
     */
    UserFocus getAttentionUser(String userId, String ufId);

    /**
     * 根据关注ID删除关注信息
     * @param attentionUserId 关注ID
     * @return true为取关成功，false为取关失败
     */
    boolean unAttentionUser(Integer attentionUserId);

    /**
     * 分页查询当前用户关注的用户列表信息
     * @param user_id 用户id
     * @param currentPage 当前页码
     * @return 列表对象
     */
    List<Map<String, Object>> findUserFocusList(String user_id, int currentPage);

    /**
     * 根据用户id分页查询用户关注其他用户数量
     * @param userId 用户id
     * @return 用户总数
     */
    long getUserFocusTotal(String userId);

    /**
     * 更新头像到数据库
     * @param path 头像虚拟路径
     */
    void uploadImg(String userId,String path);

    /**
     * 分页查询所有文章
     * @param currentPage 当前页码
     * @return 列表对象
     */
    List<Map<String, Object>> findArticleList(int currentPage,String searchName);

    /**
     * 查询文章总数量
     * @return 文章总数
     */
    long getArticleTotal(String searchName);

    /**
     * 根据文章id查询文章详细信息
     * @param articleId 文章id
     * @return map集合
     */
    Map<String, Object> getArticleInfo(String articleId);

    /**
     * 根据文章id获取关注该文章的用户
     * @param articleId 文章id
     * @return 列表对象
     */
    List<Map<String, Object>> getArticleFocusUser(String articleId);

    /**
     * 根据用户id分页查询用户收藏文章
     * @param userId 用户id
     * @param currentPage 当前页码
     * @param searchName 模糊查询文章标题
     * @return 列表对象
     */
    List<Map<String, Object>> findCollectArticleList(String userId,int currentPage, String searchName);

    /**
     * 根据用户id查询用户关注文章总数
     * @param userId 用户id
     * @param searchName 模糊查询文章标题
     * @return
     */
    long getCollectArticleTotal(String userId,String searchName);

    /**
     * 添加文章
     * @param article 文章对象
     * @return true为添加成功，false为添加失败
     */
    boolean addArticle(Article article);

    /**
     * 增加文章访问次数
     * @param articleId 文章id
     * @param count 访问次数
     */
    void updateArticles(String articleId,Integer count);

    /**
     * 检查用户是否收藏该文章
     * @param userId 用户id
     * @param articleId 文章id
     * @return false为已收藏，true为未收藏
     */
    boolean checkUserIsCollect(String userId, String articleId);

    /**
     * 添加收藏对象
     * @param favorite 收藏对象
     * @return true为收藏成功，false为收藏失败
     */
    boolean addFavorite(Favorite favorite);

    /**
     * 通过用户id和文章id查找收藏对象
     * @param userId 用户id
     * @param articleId 文章id
     * @return 收藏对象
     */
    Favorite findCollectInfo(String userId, String articleId);

    /**
     * 通过收藏id删除收藏信息
     * @param id 收藏id
     * @return true为删除成功，false为删除失败
     */
    boolean unCollectArticle(Integer id);

    /**
     * 根据用户以及关注对应用户id 查找信息
     * @param userId 当前登录的用户id
     * @param ufId 关注对方的用户id
     * @return 关注对象信息
     */
    UserFocus getFollowUser(String userId, String ufId);

    /**
     * 根据关注表主键ID 取消关注
     * @param id 主键ID
     * @return
     */
    boolean unFollowUser(Integer id);
}
